PostgreSQL 服务器编程 使用触发器管理相关数据

1 背景知识

服务器程序设计包括对自动化操作(触发器)的设定。设计好自动化操作后,数据库的中的操作便可以触发其他操作也跟随着发生。

例如,你可以设定一个处理过程,一边对一些商品进行攻击,一般在库存表中进行自动预定处理。

让我们看看如何实现这样的能力吧。

1.1 创建水果库存表

DROP   TABLE IF EXISTS fruits_in_stock;
CREATE TABLE fruits_in_stock(
    name text PRIMARY KEY,
    in_stock integer NOT NULL ,
    reserved integer NOT NULL DEFAULT 0,
    CHECK ( in_stock BETWEEN 0 AND 1000),
    CHECK ( reserved <= in_stock )
);
Tip

这里,CHECK 约束对一些基本规则的执行进行了限制:你不能多余1000的水果库存(太多了可能会坏掉),你也不能有负的库存,同时也不能为别人提供多于库存的货物。

1.2 创建水果订单表

DROP TABLE IF EXISTS fruits_offer;
CREATE TABLE fruits_offer (
    offer_id serial PRIMARY KEY ,
    recipient_name text,
    offer_date timestamp DEFAULT current_timestamp,
    fruit_name text REFERENCES fruits_in_stock,
    offered_amount integer
);

这里 offer 表为每次的水果订单创建一个ID (保证你可以却分以后得每次订单)、订货者、订单日期、订单中水果的名称和水果数量。

为了完成自动化的库存管理,需要一个触发器函数。这个函数实现仓库的管理逻辑。

INSERT INTO fruits_in_stock(name, in_stock)
VALUES ('APPLE', 500),
       ('ORANGE', 500);
SELECT *
FROM fruits_in_stock;
INSERT INTO fruits_offer(recipient_name, fruit_name, offered_amount)
VALUES ('Bob', 'APPLE', 100);
SELECT *
FROM fruits_in_stock;
UPDATE fruits_offer
SET offered_amount =115
WHERE offer_id = 1;
SELECT *
FROM fruits_in_stock;
UPDATE fruits_in_stock
SET in_stock=100
WHERE name = 'APPLE';
UPDATE fruits_offer
SET offered_amount=1100
WHERE offer_id = 1;
DELETE
FROM fruits_offer
WHERE offer_id = 1;
SELECT *
FROM fruits_in_stock;